package com.example.sqliteframe;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.lang.reflect.Field;
import java.lang.reflect.Type;

public class AnanFrame {
    //获取类的数据类型并返回其对应的数据库数据类型  这里只是常用的类型 ，可以根据自己的成员类型重写该方法
    public static  String translateType(String string){
        if (string.equals("class java.lang.Integer")||string.equals("int") )
            return  "integer";
        else if(string.equals("class java.lang.String"))
            return "varchar(100)";
        else if (string.equals("class java.lang.Float"))
            return "float";
        else if (string.equals("class java.lang.Double"))
            return "double";
        else
            return null;
    }

    //解析一个对象 并返回ContentValues类型
    public  static ContentValues parseObject(Object object){
        Field[] fields = object.getClass().getDeclaredFields();
        ContentValues values = new ContentValues();
        System.out.println("\n 类对象的成员变量对应的值如下\n");
        for (Field field : fields)
        {
            // 对于每个属性，获取成员名
            String varName = field.getName();
            try
            {
                boolean access = field.isAccessible();
                if(!access) field.setAccessible(true);
                //从obj中获取field变量
                Object o = field.get(object);
                System.out.println("变量: " + varName + " = " + o.toString());
                values.put(varName,o.toString());
                if(!access) field.setAccessible(false);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
        return values;
    }

    //创建数据库 参数分别是：上下文 表名 类名
    public static  void CreateDB(Context context,String tableName ,Class clazz){
        Field[] fields = clazz.getDeclaredFields();
        String sql="create table "+tableName+" (id integer primary key autoincrement,";
        for (Field field : fields)
        {
            // 对于每个属性，获取成员名
            String varName = field.getName();
            Type type= field.getType();
            sql = sql.concat(varName+' '+translateType(type.toString())+",");
            System.out.println("变量 " + varName + " 的类型为：" + translateType(type.toString()));
        }
        sql=sql.substring(0,sql.length()-1).concat(")");
        System.out.println(sql);
        MySqlite mySqlite = new MySqlite(context,sql);
//        SQLiteDatabase sqLiteDatabase = mySqlite.getWritableDatabase();
        System.out.println("\n***********创建数据成功*******************************\n");
//        sqLiteDatabase.close();
    }

    //数据库插入一条数据  类创建的对象
    public static void InsertDB(Context context,String tableName ,Object object){
        ContentValues contentValues = parseObject(object);

        MySqlite mySqlite = new MySqlite(context);
        SQLiteDatabase sqLiteDatabase = mySqlite.getWritableDatabase();
        sqLiteDatabase.insert(tableName ,null,contentValues);
        System.out.println("\n***********插入数据成功*******************************\n");
        sqLiteDatabase.close();
    }

    //查询所有数据  参数分别是 内容 表格名 类名
    public static void QuaryDB(Context context,String tableName ,Class clazz){
        System.out.println("\n***********查询结果如下*******************************\n");
        MySqlite mySqlite = new MySqlite(context);
        SQLiteDatabase sqLiteDatabase = mySqlite.getReadableDatabase();
        Field[] fields = clazz.getDeclaredFields();
        Cursor cursor = sqLiteDatabase.query(tableName,
                null,null,null,
                null,null,null);

        while (cursor.moveToNext()){
            String string = new String();
            for (Field field : fields)
            {
                // 对于每个属性，获取成员名
                String varName = field.getName();
                string = string.concat(varName+":"+cursor.getString(cursor.getColumnIndex(varName))+"  ");
            }
            System.out.println("\n"+string+"\n");
          }
        System.out.println("\n***********查询成功*******************************\n");
        sqLiteDatabase.close();
    }

    //根据条件更新数据   传入参数分别是 上下文  表名 类对象 对象的一个属性及其值作为条件
    public static void UpdateDB(Context context,String tableName ,Object object,String key,String value){
        ContentValues contentValues = parseObject(object);
        contentValues.remove(key);  //剔除条件
        MySqlite mySqlite = new MySqlite(context);
        SQLiteDatabase sqLiteDatabase = mySqlite.getWritableDatabase();

        int a=sqLiteDatabase.update(tableName,contentValues,key+"=?",new String[]{value});
        System.out.println("\n***********更新数据成功******************************\n");
        sqLiteDatabase.close();
    }

    //根据 键值对 条件删除数据  如果 key或者value中有一个为null，就删除所有数据
    public static void DeleteDB(Context context,String tableName ,String key,String value){
        MySqlite mySqlite = new MySqlite(context);
        SQLiteDatabase sqLiteDatabase = mySqlite.getWritableDatabase();
        if(null==key || null == value) {
            sqLiteDatabase.delete(tableName, null, null);
            System.out.println("\n***********所有数据删除成功******************************\n");
        }
        else{
            sqLiteDatabase.execSQL("delete from "+tableName+" where "+key+"= '"+value+"'");
            System.out.println("\n***********一条数据删除成功******************************\n");
        }
        sqLiteDatabase.close();
    }

}
